<?php

//decode by http://www.cnmmm.com/
if (!defined('IN_ROOT')) {
	exit('Access denied');
}
Administrator(5);
$action = SafeRequest("action", "get");
switch ($action) {
	case 'backup':
		mainjump();
		delold();
		backup();
		break;
	case 'backupnext':
		mainjump();
		backupnext();
		break;
	case 'restore':
		mainjump();
		restore();
		break;
	case 'delsql':
		mainjump();
		delsql();
		break;
	case 'inzip':
		mainjump();
		inzip();
		break;
	case 'unzip':
		mainjump();
		unzip();
		break;
	case 'delzip':
		mainjump();
		delzip();
		break;
	case 'mainjump':
		mainjump();
		break;
	default:
		main();
		break;
}
function main()
{
	echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=';
	echo IN_CHARSET;
	echo '" />
<meta http-equiv="x-ua-compatible" content="ie=7" />
<title>站点备份</title>
<link href="static/admincp/css/main.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">function $(obj) {return document.getElementById(obj);}</script>
</head>
<body>
<div class="container">
<script type="text/javascript">parent.document.title = \'菜鸟源码分发平台 Board 管理中心 - 工具 - 站点备份\';if(parent.$(\'admincpnav\')) parent.$(\'admincpnav\').innerHTML=\'工具&nbsp;&raquo;&nbsp;站点备份\';</script>
<div class="floattop"><div class="itemtitle"><h3>站点备份</h3></div></div><div class="floattopempty"></div>
<form method="post" name="form" target="iframe">
<table class="tb tb2">
<tr><th class="partition">备份数据</th></tr>
</table>
<table class="tb tb2">
<tr><td>分卷备份大小：<input type="text" class="txt" name="size" onkeyup="this.value=this.value.replace(/[^\\d]/g,\'\')" onbeforepaste="clipboardData.setData(\'text\',clipboardData.getData(\'text\').replace(/[^\\d]/g,\'\'))">默认2048KB</td><td><input type="submit" class="btn" value="开始备份数据" onclick="form.action=\'?iframe=backup&action=backup\'" /></td><td><input type="submit" class="btn" value="还原数据" onclick="form.action=\'?iframe=backup&action=restore\'" /></td><td>';
	echo checksql();
	echo '</td></tr>
</table>
<table class="tb tb2">
<tr><th class="partition">备份文件</th></tr>
</table>
<table class="tb tb2">
<tr><td>压缩解压目录：<input type="text" class="txt" name="dir">留空为根目录</td><td><input type="submit" class="btn" value="开始压缩文件" onclick="form.action=\'?iframe=backup&action=inzip\'" /></td><td><input type="submit" class="btn" value="解压文件" onclick="form.action=\'?iframe=backup&action=unzip\'" /></td><td>';
	echo checkzip();
	echo '</td></tr>
</table>
</form>
<h3>菜鸟源码分发平台 提示</h3>
<div class="infobox"><iframe name="iframe" frameborder="0" width="100%" height="100%" src="?iframe=backup&action=mainjump"></iframe></div>
</div>
</body>
</html>
';
}
function backup()
{
	global $db;
	$size = !empty($_POST['size']) ? SafeRequest("size", "post") : '2048';
	$result = $db->query('SHOW TABLES FROM ' . IN_DBNAME);
	if ($result) {
		$dbfile = 'data/backup/table_' . substr(md5(time() . mt_rand(1000, 5000)), 0, 16) . '.sql';
		$fp = fopen($dbfile, 'w');
		while ($row = $db->fetch_row($result)) {
			$prefix = explode('_', $row[0]);
			if ($prefix[0] == str_replace('_', '', IN_DBTABLE)) {
				fwrite($fp, "\r\nDROP TABLE IF EXISTS `{$row[0]}`;\r\n\r\n");
				$sql = "SHOW CREATE TABLE `{$row[0]}`";
				$Struct = $db->getall($sql);
				if ($Struct) {
					$data = str_replace("\n", "\r\n", $Struct[0]['Create Table']) . ";\r\n";
					fwrite($fp, $data);
					echo "备份数据表结构 <span style=\"color:#090\">" . $row[0] . "</span> ... 成功<br />";
				} else {
					echo "备份数据表结构 <span style=\"color:#C00\">" . $row[0] . "</span> ... 失败<br />";
				}
			}
		}
		fclose($fp);
		echo "<br /><span style=\"color:#09C\">数据表结构备份完毕，即将备份数据内容...</span><script type=\"text/javascript\">setTimeout(\"location.href='?iframe=backup&action=backupnext&size=" . $size . "';\", 3000);</script>";
	}
}
function backupnext()
{
	global $db;
	$size = SafeRequest("size", "get");
	$tableresult = $db->query('SHOW TABLES FROM ' . IN_DBNAME);
	if ($tableresult) {
		$bakstr = '';
		$batch = 0;
		while ($tablerow = $db->fetch_row($tableresult)) {
			$prefix = explode('_', $tablerow[0]);
			if ($prefix[0] == str_replace('_', '', IN_DBTABLE)) {
				$intable = "INSERT INTO `{$tablerow[0]}` VALUES(";
				$fieldresult = $db->query("SHOW FULL COLUMNS FROM {$tablerow[0]}");
				$i = 0;
				if ($fieldresult) {
					while ($fieldrow = $db->fetch_array($fieldresult)) {
						$fs[$i] = $fieldrow['Field'];
						$i++;
					}
					$fsd = $i - 1;
					$sql = "select * from `{$tablerow[0]}`";
					$result = $db->getall($sql);
					for ($j = 0; $j < count($result); $j++) {
						$line = $intable;
						for ($k = 0; $k <= $fsd; $k++) {
							if ($k < $fsd) {
								$line .= "'" . $db->escape_field($result[$j][$fs[$k]]) . "',";
							} else {
								$line .= "'" . $db->escape_field($result[$j][$fs[$k]]) . "');\r\n";
							}
						}
						$bakstr .= $line;
						if (strlen($bakstr) > $size * 1024) {
							$batch = $batch + 1;
							$dbfile = 'data/backup/data_' . $batch . '-' . substr(md5(time() . mt_rand(1000, 5000)), 0, 16) . '.sql';
							$fp = fopen($dbfile, 'w');
							fwrite($fp, preg_replace("/'\\);\r?\n\\]/", "');", $bakstr . "]"));
							fclose($fp);
							echo "分卷文件 <span style=\"color:#090\">" . $dbfile . "</span> 备份成功...<br />";
							$bakstr = '';
						}
					}
				}
			}
		}
		if (!empty($bakstr) && strlen($bakstr) < $size * 1024) {
			$dbfile = 'data/backup/data_0-' . substr(md5(time() . mt_rand(1000, 5000)), 0, 16) . '.sql';
			$fp = fopen($dbfile, 'w');
			fwrite($fp, preg_replace("/'\\);\r?\n\\]/", "');", $bakstr . "]"));
			fclose($fp);
			echo "分卷文件 <span style=\"color:#090\">" . $dbfile . "</span> 备份成功...<br />";
		}
		echo "<br /><span style=\"color:#090\">恭喜，数据库已经全部备份完成！</span>";
	}
}
function delold()
{
	fwrite(fopen('data/backup/bak.log', 'w'), date('Y-m-d H:i:s'));
	$d = 'data/backup/';
	if (is_dir($d)) {
		$dh = opendir($d);
		while (false !== ($file = readdir($dh))) {
			if ($file != "." && $file != "..") {
				$fullpath = $d . $file;
				if (!is_dir($fullpath) && stristr($file, '.sql')) {
					unlink($fullpath);
				}
			}
		}
		closedir($dh);
	}
}
function restore()
{
	global $db;
	if (is_file('data/backup/bak.log')) {
		$d = 'data/backup/';
		if (is_dir($d)) {
			$dh = opendir($d);
			while (false !== ($file = readdir($dh))) {
				if ($file != "." && $file != "..") {
					$fullpath = $d . $file;
					if (!is_dir($fullpath) && stristr($file, 'table_')) {
						$table_str = @file_get_contents($fullpath);
						$tablearr = explode(';', $table_str);
						for ($i = 0; $i < count($tablearr) - 1; $i++) {
							$db->query($tablearr[$i]);
						}
					} elseif (!is_dir($fullpath) && stristr($file, 'data_')) {
						$filearr[] = $fullpath;
					}
				}
			}
			closedir($dh);
			for ($i = 0; $i < count($filearr); $i++) {
				$data_str = @file_get_contents(trim($filearr[$i]));
				$dataarr = explode("\n", $data_str);
				for ($j = 0; $j < count($dataarr); $j++) {
					$db->query($dataarr[$j]);
				}
				echo "成功还原 <span style=\"color:#090\">" . $j . "</span> 条数据...<br />";
			}
			echo "<br /><span style=\"color:#090\">恭喜，数据库已经全部还原完成！</span>";
		}
	} else {
		echo "<span style=\"color:#C00\">没有找到备份文件，请先备份数据！</span>";
	}
}
function checksql()
{
	if (is_file('data/backup/bak.log')) {
		echo "<input type=\"submit\" class=\"btn\" value=\"删除备份\" onclick=\"form.action='?iframe=backup&action=delsql'\" />";
	} else {
		echo "<input type=\"button\" class=\"btn\" value=\"暂无备份\" disabled=\"disabled\" />";
	}
}
function delsql()
{
	@unlink('data/backup/bak.log');
	$d = 'data/backup/';
	if (is_dir($d)) {
		$dh = opendir($d);
		while (false !== ($file = readdir($dh))) {
			if ($file != "." && $file != "..") {
				$fullpath = $d . $file;
				if (!is_dir($fullpath) && stristr($file, '.sql')) {
					unlink($fullpath);
				}
			}
		}
		closedir($dh);
	}
	echo "<span style=\"color:#090\">备份文件已删除！</span>";
}
function inzip()
{
	include_once 'source/pack/zip/zip.php';
	$dir = !empty($_POST['dir']) ? SafeRequest("dir", "post") : IN_ROOT;
	$inzip = 'data/backup/bak.zip';
	@unlink($inzip);
	$zip = new PclZip($inzip);
	if (($list = $zip->create($dir, PCLZIP_OPT_REMOVE_PATH, $dir)) == 0) {
		echo "<span style=\"color:#C00\">" . $zip->errorInfo(true) . "</span>";
	} else {
		echo "<span style=\"color:#090\">恭喜，文件已经全部压缩完成！</span><a href=\"" . $inzip . "\">立即下载</a>";
	}
}
function unzip()
{
	include_once 'source/pack/zip/zip.php';
	$dir = !empty($_POST['dir']) ? SafeRequest("dir", "post") : IN_ROOT;
	$unzip = 'data/backup/bak.zip';
	if (is_file($unzip)) {
		$zip = new PclZip($unzip);
		if (($list = $zip->listContent()) == 0) {
			exit("<span style=\"color:#C00\">" . $zip->errorInfo(true) . "</span>");
		}
		$zip->extract(PCLZIP_OPT_PATH, $dir, PCLZIP_OPT_REPLACE_NEWER);
		echo "<span style=\"color:#090\">恭喜，文件已经全部解压完成！</span>";
	} else {
		echo "<span style=\"color:#C00\">没有找到指定的压缩包，请先备份文件！</span>";
	}
}
function checkzip()
{
	if (is_file('data/backup/bak.zip')) {
		echo "<input type=\"submit\" class=\"btn\" value=\"删除备份\" onclick=\"form.action='?iframe=backup&action=delzip'\" />";
	} else {
		echo "<input type=\"button\" class=\"btn\" value=\"暂无备份\" disabled=\"disabled\" />";
	}
}
function delzip()
{
	@unlink('data/backup/bak.zip');
	echo "<span style=\"color:#090\">指定的压缩包已删除！</span>";
}